{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 线性回归实验（MNIST & CIFAR-10）",
   "id": "f5f09f42b0a4195"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T03:08:16.318629Z",
     "start_time": "2025-06-10T03:08:09.741107Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ],
   "id": "b1a50e27bba7763",
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据集加载",
   "id": "cd46d0499d8867b6"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T03:08:18.078192Z",
     "start_time": "2025-06-10T03:08:16.322647Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def load_mnist():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5,), (0.5,))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def load_cifar10():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def dataset_to_numpy(dataset, flatten=True):\n",
    "    X = []\n",
    "    y = []\n",
    "    for img, label in dataset:\n",
    "        arr = img.numpy()\n",
    "        if flatten:\n",
    "            arr = arr.flatten()\n",
    "        else:\n",
    "            arr = arr.transpose(1, 2, 0)\n",
    "        X.append(arr)\n",
    "        y.append(label)\n",
    "    X = np.array(X)\n",
    "    y = np.array(y)\n",
    "    return X, y\n",
    "\n",
    "mnist_train, mnist_test = load_mnist()\n",
    "cifar_train, cifar_test = load_cifar10()\n",
    "print(f\"MNIST训练集样本数: {len(mnist_train)}，测试集样本数: {len(mnist_test)}\")\n",
    "print(f\"CIFAR-10训练集样本数: {len(cifar_train)}，测试集样本数: {len(cifar_test)}\")\n"
   ],
   "id": "725f40e90affd775",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST训练集样本数: 60000，测试集样本数: 10000\n",
      "CIFAR-10训练集样本数: 50000，测试集样本数: 10000\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据预处理",
   "id": "17fe2d837cc23505"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T03:08:32.444689Z",
     "start_time": "2025-06-10T03:08:18.376372Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# MNIST\n",
    "X_train_m, y_train_m = dataset_to_numpy(mnist_train)\n",
    "X_test_m, y_test_m = dataset_to_numpy(mnist_test)\n",
    "# CIFAR-10\n",
    "X_train_c, y_train_c = dataset_to_numpy(cifar_train)\n",
    "X_test_c, y_test_c = dataset_to_numpy(cifar_test)\n",
    "# 只取部分样本\n",
    "n_samples = 5000\n",
    "X_train_m, y_train_m = X_train_m[:n_samples], y_train_m[:n_samples]\n",
    "X_test_m, y_test_m = X_test_m[:1000], y_test_m[:1000]\n",
    "X_train_c, y_train_c = X_train_c[:n_samples], y_train_c[:n_samples]\n",
    "X_test_c, y_test_c = X_test_c[:1000], y_test_c[:1000]\n",
    "# 标准化\n",
    "scaler_m = StandardScaler().fit(X_train_m)\n",
    "X_train_m = scaler_m.transform(X_train_m)\n",
    "X_test_m = scaler_m.transform(X_test_m)\n",
    "scaler_c = StandardScaler().fit(X_train_c)\n",
    "X_train_c = scaler_c.transform(X_train_c)\n",
    "X_test_c = scaler_c.transform(X_test_c)\n"
   ],
   "id": "6c74be7d6100afb4",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 线性回归模型训练与评估",
   "id": "41f69804a9194c8d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T03:08:39.752501Z",
     "start_time": "2025-06-10T03:08:32.459678Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def train_and_evaluate(model, X_train, y_train, X_test, y_test):\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    # 线性回归输出为连续值，需转为整数类别\n",
    "    y_pred_cls = np.round(y_pred).astype(int)\n",
    "    y_pred_cls = np.clip(y_pred_cls, 0, 9)  # MNIST和CIFAR-10都是0-9\n",
    "    acc = accuracy_score(y_test, y_pred_cls)\n",
    "    cm = confusion_matrix(y_test, y_pred_cls)\n",
    "    return acc, cm, y_pred_cls\n",
    "\n",
    "# MNIST\n",
    "lr_mnist = LinearRegression()\n",
    "acc_m, cm_m, y_pred_m = train_and_evaluate(lr_mnist, X_train_m, y_train_m, X_test_m, y_test_m)\n",
    "print(f\"MNIST 线性回归准确率: {acc_m:.3f}\")\n",
    "# CIFAR-10\n",
    "lr_cifar = LinearRegression()\n",
    "acc_c, cm_c, y_pred_c = train_and_evaluate(lr_cifar, X_train_c, y_train_c, X_test_c, y_test_c)\n",
    "print(f\"CIFAR-10 线性回归准确率: {acc_c:.3f}\")\n"
   ],
   "id": "36c86d1de965ab3f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST 线性回归准确率: 0.219\n",
      "CIFAR-10 线性回归准确率: 0.132\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 可视化分析",
   "id": "a29136764f5c1e98"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T03:08:40.034369Z",
     "start_time": "2025-06-10T03:08:39.768139Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 准确率柱状图\n",
    "plt.figure(figsize=(5,4))\n",
    "plt.bar(['MNIST', 'CIFAR-10'], [acc_m, acc_c])\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('线性回归在不同数据集上的准确率')\n",
    "plt.show()\n",
    "# 混淆矩阵\n",
    "fig, axes = plt.subplots(1,2, figsize=(12,5))\n",
    "axes[0].imshow(cm_m, cmap=plt.cm.Blues)\n",
    "axes[0].set_title('MNIST 混淆矩阵')\n",
    "axes[1].imshow(cm_c, cmap=plt.cm.Blues)\n",
    "axes[1].set_title('CIFAR-10 混淆矩阵')\n",
    "for ax in axes:\n",
    "    ax.set_xlabel('Predicted')\n",
    "    ax.set_ylabel('True')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "id": "feae29f2ec44837f",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32447 (\\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24615 (\\N{CJK UNIFIED IDEOGRAPH-6027}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22238 (\\N{CJK UNIFIED IDEOGRAPH-56DE}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24402 (\\N{CJK UNIFIED IDEOGRAPH-5F52}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22312 (\\N{CJK UNIFIED IDEOGRAPH-5728}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25454 (\\N{CJK UNIFIED IDEOGRAPH-636E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19978 (\\N{CJK UNIFIED IDEOGRAPH-4E0A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ],
      "image/png": "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Xl5eCgoK0qBBg2yfbw8ODlZKSoptfHn/Ph944AG7OSMjI+Xu7q7vv//+lse7+byxWCyqU6eOQkJCNH369Dt+E9bGjRs1aNAgBQYGymKxlPtlH3xlpXMQUzhFUFCQVq5cqV9++cW27erVq1q+fLkefPBBu7He3t6aPXu2/ve//1V6/rS0NE2ZMkWTJk3S7t27tXnzZk2fPl2XL1+WJH3//fc6c+aMzpw5oy+++EKS9MMPP9i2ffjhh044SkA6fvy4unfvrvXr1+u9997Tvn37lJmZqSeffFLjx4+vcL933nnH9u/xzJkz2rVrl+2+3NxcbdmyRRMmTKjwG7P69++vM2fO6Mcff9QHH3ygv//970pISLjtWouLi9W1a1elpqZWOIavrHQOl3/OFPeHbt266dixY1q9erVefvllSdLq1av14IMPKiQkxG5sRESEjh49qsTERCUnJ1dq/i+//FIvvfSSRo8ebdvWsWNH28/NmjWz/dykSRNJUvPmzfmzkHC6V199VRaLRdu3b1f9+vVt2zt27KhRo0ZVuF/Dhg0r/DOp6enpeuaZZzRu3Dj17t1bc+fOVd26de3GeHl52fYPCgpSRESE1q1bp9mzZ1f4mAMGDNCAAQMqvP//fmWlJH3yySfy9/fX2rVry/2WLZSPM1M4zahRo5Senm77PS0tzfaXrH7P3d1d7777rj766COdOnWqUnMHBARo69atOnHihNPWCzjqwoULyszM1Pjx4+1CelNV/s+b1WpVenq6XnnlFbVv315t2rTR559/ftt99u/fry1btsjT09Phx/u9O31lJSqPmMJpXnnlFW3atEknTpzQiRMntHnzZr3yyivljn3++ecVGhp6x5epbkpISFCjRo0UHBysdu3aaeTIkfrss89UVlbmzEMAbuvo0aOyWq1q3769w/u+/vrratCgge02b948SdI333yjK1euKDIyUtKN59HixYtv2f/f//63GjRoIG9vb3Xu3Flnz57VtGnTjI6nKl9ZifIRUzhNs2bNNHDgQC1ZskTp6ekaOHCg/Pz8Khw/e/ZsLV26VIcOHbrj3C1atFB2drb27dunyZMn69dff9WIESPUv39/goq7xuQPxk2bNk27d++23aKjoyXdeAVn6NCh8vC48a7b8OHDtXnzZh07dsxu/yeffFK7d+/Wtm3bNGLECMXExGjw4MGSpP/+9792oV62bFmV14mqIaZwqlGjRmnJkiVaunTpbd8/kqTHH39ckZGRiouLq/T8nTp10quvvqpPP/1U69at07p16/Tdd9+ZLhuolLZt28pisejw4cMO7+vn56c2bdrYbo0aNdKFCxe0Zs0a/e1vf5OHh4c8PDzUsmVL/frrr7dciFS/fn21adNGXbt2VVpamrZt22Y7g+3Ro4ddqJ999tlKren3X1n5e7f7GkyUj5jCqfr376+SkhJdv37d9rLV7SQlJelf//pXld6f6dChg6QbVywCd0OTJk0UGRmp1NTUcv/d/f6jXJWxbNkyPfDAA9qzZ49dDN9//30tWbJEpaWl5e7n5uamGTNmaObMmfrll19Ut25du1A3bNiwUo/PV1Y6DzGFU7m7u+vQoUM6ePCg3N3d7zi+c+fOevnll23vH1Vk3LhxmjVrljZv3qwTJ05o69atio6OVrNmzXjS465KTU1VaWmpevXqpS+++EJHjhzRoUOHNG/ePIf/LS5evFgvvviiOnXqZHcbPXq0zp8/r8zMzAr3HTJkiNzd3W/7sZfLly/bAi3duOBo9+7dys3NlWT/lZVffvml9u3bp+joaL6ysgqIKZzOx8dHPj4+lR7/zjvv3PF9z4iICG3dulVDhgzRww8/rMGDB8vb21tZWVlq2rSp6ZKBSmvdurVycnL05JNPaurUqerUqZP69eunrKwsLViwoNLz7Ny5U3v27LG97/l7vr6+euqpp8q9EOkmDw8PTZgwQcnJyRW+OrNjxw6FhYUpLCxM0o3vjw4LC1N8fLxtzPTp0zVx4kSNHTtWPXv21OXLl/nKyirgK9gAADDEmSkAAIaIKQAAhogpAACGiCkAAIaIKQAAhogpAACGiCkAAIaIKQAAhogpAACGiCkAAIaIKQAAhogpAACG/h+cTkpRopSTmgAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_23648\\985834842.py:16: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_23648\\985834842.py:16: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_23648\\985834842.py:16: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_23648\\985834842.py:16: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBUAAAHqCAYAAABbfXZsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0gElEQVR4nO3deXwV9b0//ncIkAQIiyibgIBWBUEFUav0y9Li0rrW1t2KtnKroqJUKtSHFVdcSmurLai16m3BrV43rPXHtYpQxQ216rW4WxQRrYUQkADJ+f3RS25TICGfAJNjns/H4/yROXNmXhlCzpsXM3MKcrlcLgAAAADqqVnWAQAAAID8pFQAAAAAkigVAAAAgCRKBQAAACCJUgEAAABIolQAAAAAkigVAAAAgCRKBQAAACCJUgEAAABIolQAAAAAkigVYBPcdtttUVBQEAUFBTF37tz1ns/lctGjR48oKCiIQw89tMZz6143ZcqUjW73+eefr142adKkKCgoiE8//bTGug899FAMGzYsOnXqFK1atYo+ffrEMcccE3/84x8jImL48OHV+6rtMWnSpM1wRACAL7K33347vv/970efPn2iuLg42rZtG0OGDImf//zn8fnnn1ev16tXr43OPv/+6NKlS431li5dGsXFxVFQUBCvv/76BnOccsopNbZRVFQUO++8c/z4xz+OVatWbdL38uyzz8aZZ54Ze+21V7Ro0SIKCgpqXf+WW26Jvn37RnFxcXzpS1+K66+/fpP2A01V86wDQD4pLi6OGTNmxFe+8pUay2fPnh0ffPBBFBUVbfS11157bZxxxhnRqlWreu/3Jz/5SYwfPz6GDRsWEydOjFatWsVbb70V//3f/x133nlnHHzwwXHhhRfGaaedVv2a5557Ln7xi1/Ej370o+jbt2/18t13332D+/jVr34V48aNi+bNN/xrYdttt4333nsvs/UAgK3j4YcfjqOPPjqKiori5JNPjv79+8fq1atj7ty5MX78+HjttdfipptuqnUbBxxwQJx88sk1lpWUlNT4+p577qkuG6ZPnx6XX375BrdVVFQUv/71ryMiYtmyZfHAAw/EZZddFm+//XZMnz69zu/nD3/4Q/z617+O3XffPfr06RNvvPHGRte98cYb4/TTT49vfetbMW7cuJgzZ06cc845sXLlyrjgggs2+rrXXnstBg4cGC1bttzg86tXr47XX389Vq1alcl6O+6440azQ4PlgDrdeuutuYjIHXXUUbltt902t2bNmhrPjx49OrfXXnvldthhh9whhxxS47mIyO255565iMhNmTJlg9t97rnnqpddfPHFuYjIffLJJ7lcLpdbs2ZNrm3btrkDDjhgg9k+/vjjDS6/5557chGRe/zxxzfpe7z++utzF1544Qaf+/zzz3Pbb799pusBAFveO++8k2vTpk1u1113zS1atGi95998883cddddV/31xmafMWPG1LmvoUOH5o466qjceeedl+vdu/cG1xk1alSudevWNZZVVVXlvvzlL+cKCgpyixcvrnM/ixcvzq1cuTKXy+VyY8aMyW3sn0ArV67MdezYcb3v58QTT8y1bt0699lnn210H6+88kpuyJAhG31+3333zb355puZrQdbkssfoB6OP/74+Pvf/x6zZs2qXrZ69er4/e9/HyeccMJGXzdkyJD46le/Gtdcc02NUwY3xaeffhplZWUxZMiQDT7fqVOnem0PAGBjrrnmmigvL49bbrklunbtut7zO+20U4wdO7bB+/nb3/4Wc+bMieOOOy6OO+64ePfdd+Opp57apNcWFBTEV77ylcjlcvHOO+/UuX7nzp3XO0tiQx5//PH4+9//HmeeeWaN5WPGjIkVK1bEww8/vEn5oKlRKkA99OrVK/bbb7+44447qpc98sgjsWzZsjjuuONqfe2kSZPi448/jqlTp9Zrn506dYqSkpJ46KGH4rPPPkvKDQCwKR566KHo06dP7L///g3azqpVq+LTTz+t8aioqKh+/o477ojWrVvHoYceGvvss0/suOOOm3QpwzrrLo3s0KFDg3L+qxdffDEiIgYPHlxj+V577RXNmjWrfh6oSakA9XTCCSfE/fffX33GwfTp02PYsGHRrVu3Wl/3//7f/4sRI0bEtddeW6+zFZo1axbjx4+PF154IXr27Bnf+MY34sorr4z58+c36PsAAPhXZWVl8eGHH8aAAQMavK1bbrkltttuuxqPf/1PmenTp8cRRxxRfQbBscceG3fffXesXbt2g9tbV0y8/fbbMWXKlLj33nujf//+scsuuzQ46zofffRRFBYWrncWaMuWLaNjx46xaNGizbYv+CJRKkA9HXPMMfH555/HzJkzY/ny5TFz5sxaL334V5MmTYrFixfHtGnT6rXPSy65JGbMmBEDBw6MRx99NC688MLYa6+9YtCgQRu9WzIAQH2UlZVFRERpaWmDt3XEEUfErFmzajwOOuigiIj4y1/+Eq+88kocf/zx1esff/zx8emnn8ajjz663rZWrFhRXUzstNNOcf7558eQIUPigQceqPOTHOrj888/3+gND4uLi+t9CSs0FT79Aeppu+22i5EjR8aMGTNi5cqVUVlZGd/+9rc36bVDhw6NESNGxDXXXBOnn356vfZ7/PHHx/HHHx9lZWXxzDPPxG233RYzZsyIww47LF599dUoLi5O+XYAACIiom3bthERsXz58gZvq3v37jFy5MgNPve73/0uWrduHX369Im33norIv75j/ZevXrF9OnT45BDDqmxfnFxcTz00EMREfHBBx/ENddcE0uWLKlxn4Ty8vIoLy+v/rqwsDC22267emUuKSmJ1atXb/C5VatWbdJ9GaApUipAghNOOCFGjx4dixcvjq9//evRvn37TX7txRdfHMOHD48bb7yxXq9bp23btnHAAQfEAQccEC1atIjbb789nnnmmRg2bFi9twUAsE7btm2jW7du8eqrr26xfeRyubjjjjtixYoV0a9fv/WeX7JkSZSXl0ebNm2qlxUWFtYoKA466KDYdddd4/vf/348+OCDEfHPj9++5JJLqtfZYYcd6v2R1F27do3KyspYsmRJjUsgVq9eHX//+9/rvNQVmiqXP0CCb37zm9GsWbOYN2/eJl/6sM6wYcNi+PDhcfXVVzf4NLp1NxL66KOPGrQdAICIiEMPPTTefvvtePrpp7fI9mfPnh0ffPBBXHrppXHPPffUeNx0002xcuXKuP/++2vdRteuXeO8886Lhx56KObNmxcRESeffHKNSy3qc9PHdfbcc8+IiHj++edrLH/++eejqqqq+nmgJmcqQII2bdrE1KlT47333ovDDjus3q+fNGlSDB8+PG666aY61125cmW8/PLLsd9++6333COPPBIRsVlvUgQANF0//OEPY/r06XHaaafFn/70p+jcuXON599+++2YOXNm8sdKrrv0Yfz48Ru8dPPaa6+N6dOnx0knnVTrds4+++y49tpr46qrror7778/+vTpE3369EnKtM5Xv/rV2GabbWLq1KnxjW98o3r51KlTo1WrVutdlgH8k1IBEo0aNSr5tcOGDYthw4bF7Nmz61x35cqVsf/++8eXv/zlOPjgg6NHjx6xdOnSuP/++2POnDlx5JFHxsCBA5OzAACss+OOO8aMGTPi2GOPjb59+8bJJ58c/fv3j9WrV8dTTz0V99xzT5xyyilJ266oqIh77703DjjggI3eC+rwww+Pn//85+tdgvDvOnbsGKeeemr86le/itdffz369u270XXff//9+O1vfxsR/3cWwuWXXx4R/7xM4jvf+U5E/POeCpdddlmMGTMmjj766DjooINizpw58bvf/S6uuOKK2GabbZK+b/iiUypARiZNmhQjRoyoc7327dvHzTffHA8//HDceuutsXjx4igsLIxddtklrr322jjnnHO2QloAoKk4/PDD4y9/+Utce+218cADD8TUqVOjqKgodt9995gyZUqMHj06absPP/xwLF26tNazPA877LCYMmVK3HnnnXXOOOPGjYtp06bF1VdfHbfddttG13v33XfjoosuqrFs3dfDhg2rLhUiIs4888xo0aJFTJkyJR588MHo0aNH/OxnP0s+MwOaAqUCbIJTTjllk1r5Dd0QKJfLbXDd4cOHb/C5SZMmxaRJk6q/bt68eZx22mlx2mmnbWrciIj49re/vdF9AwDU5ktf+tImXaZZn9nnqKOOqnM2GTZsWI11brvtto0WBn369Im1a9fWmXFjM9fGjB49Ork4gabIjRoBAACAJM5UAKr95Cc/iRtuuGGDz/3rRztltR4AQGM1b968jX5ceHl5eebrwZZSkHN+NAAAAJDA5Q8AAABAEqUCAAAAkESpAAAAACTJ6xs1VlVVxaJFi6K0tDQKCgqyjgNAHsvlcrF8+fLo1q1bNGumcyc/mY0A2Fw2dTbK61Jh0aJF0aNHj6xjAPAFsnDhwujevXvWMSCJ2QiAza2u2SivS4XS0tKIiLjj8ZejVZvSjNNs2Jz3/5F1hDq9vqgs6wi1On/YjllHqNP2HUqyjlCr5oWN/39di1o07oz5cAxpmOVlZbFT7x7V7y2Qj9b9/F774NNR0rpxfiTv7p3aZx2hTp+uXJ11hFr97Im3s45QpwWvL846Qq0O/9ouWUeoU+9tirKOUKu9u7bPOkKdilsUZh0hr60oXx5f369fnbNRXpcK607ra9WmNFo30lKhqPWarCPUqUVJVdYRatWmtG3WEepU2lap0FDFSgUaCaeMk8/W/fyWtG4TJY10NsqH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y6ofCxcu3MIpAQC2DrMRAPkoszMVXnjhhViyZEkMGjSoelllZWU8+eSTccMNN0RFRUUUFhbWeE1RUVEUFRVt7agAAFuc2QiAfJRZqfC1r30tXnnllRrLTj311Nh1113jggsuWO9NEwDgi8xsBEA+yqxUKC0tjf79+9dY1rp16+jYseN6ywEAvujMRgDko8w//QEAAADIT5l++sO/e+KJJ7KOAADQaJiNAGjsks5UmDNnTpx00kmx3377xYcffhgREb/97W9j7ty5mzUcAEA+MBsB0FTVu1S4995746CDDoqSkpJ48cUXo6KiIiIili1bFldeeeVmDwgA0JiZjQBoyupdKlx++eUxbdq0uPnmm6NFixbVy4cMGRLz58/frOEAABo7sxEATVm9S4UFCxbE0KFD11verl27WLp06ebIBACQN8xGADRl9S4VunTpEm+99dZ6y+fOnRt9+vTZLKEAAPKF2QiApqzepcLo0aNj7Nix8cwzz0RBQUEsWrQopk+fHueff36cccYZWyIjAECjZTYCoCmr90dKTpgwIaqqquJrX/tarFy5MoYOHRpFRUVx/vnnx9lnn70lMgIANFpmIwCasnqXCgUFBXHhhRfG+PHj46233ory8vLo169ftGnTZkvkAwBo1MxGADRl9S4V1mnZsmX069dvc2YBAMhbZiMAmqJ6lwojRoyIgoKCjT7/pz/9qUGBAADyidkIgKas3qXCnnvuWePrNWvWxEsvvRSvvvpqjBo1anPlAgDIC2YjAJqyepcKP/vZzza4fNKkSVFeXt7gQAAA+cRsBEBTVu+PlNyYk046KX7zm99srs0BAOQ1sxEATUHyjRr/3dNPPx3FxcWba3P10rywWTQv3Gz9SJOzdMXqrCPUatWayqwj1GnvLh2yjlCrXXfsmHWEOu3WvW3WEWqVD79j2rdqkXWEWjUv3Pg1541BY89H/slyNnr/0xXRelVhJvuuS/matVlHyHt/W7Yq6wh1WtHI58uhX9om6wh1al/SOP8Or3P6Pj2zjpD3Slo07j/jNZuYr96lwlFHHVXj61wuFx999FE8//zzcdFFF9V3cwAAec1sBEBTVu9SoV27djW+btasWeyyyy5x6aWXxoEHHrjZggEA5AOzEQBNWb1KhcrKyjj11FNjwIAB0aFD4z7dGwBgSzMbAdDU1esi4cLCwjjwwANj6dKl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m09/+F/77rtv7L333nHDDTdERERVVVX06NEjzj777JgwYULG6fLPJ598Ep06dYrZs2fH0KFDs46TN8rLy2PQoEHxq1/9Ki6//PLYc88947rrrss6Vt6YMGFC/PnPf445c+ZkHSUvHXroodG5c+e45ZZbqpd961vfipKSkvjd736XYTIgC2ajzctslM58lM5s1HDmo7o5UyEiVq9eHS+88EKMHDmyelmzZs1i5MiR8fTTT2eYLH8tW7YsIiK22WabjJPklzFjxsQhhxxS42eRTffggw/G4MGD4+ijj45OnTrFwIED4+abb846Vt7Yf//947HHHos33ngjIiJefvnlmDt3bnz961/POBmwtZmNNj+zUTrzUTqzUcOZj+rWPOsAjcGnn34alZWV0blz5xrLO3fuHH/9618zSpW/qqqq4txzz40hQ4ZE//79s46TN+68886YP39+PPfcc1lHyVvvvPNOTJ06NcaNGxc/+tGP4rnnnotzzjknWrZsGaNGjco6XqM3YcKEKCsri1133TUKCwujsrIyrrjiijjxxBOzjgZsZWajzctslM581DBmo4YzH9VNqcBmN2bMmHj11Vdj7ty5WUfJGwsXLoyxY8fGrFmzori4OOs4eauqqioGDx4cV155ZUREDBw4MF599dWYNm2aN85NcPfdd8f06dNjxowZsdtuu8VLL70U5557bnTr1s3xA2gAs1Ea81HDmY0aznxUN6VCRGy77bZRWFgYH3/8cY3lH3/8cXTp0iWjVPnprLPOipkzZ8aTTz4Z3bt3zzpO3njhhRdiyZIlMWjQoOpllZWV8eSTT8YNN9wQFRUVUVhYmGHC/NC1a9fo169fjWV9+/aNe++9N6NE+WX8+PExYcKEOO644yIiYsCAAfH+++/H5MmTvWlCE2M22nzMRunMRw1nNmo481Hd3FMhIlq2bBl77bVXPPbYY9XLqqqq4rHHHov99tsvw2T5I5fLxVlnnRX33Xdf/OlPf4revXtnHSmvfO1rX4tXXnklXnrpperH4MGD48QTT4yXXnrJG+YmGjJkyHof1/XGG2/EDjvskFGi/LJy5cpo1qzm20JhYWFUVVVllAjIitmo4cxGDWc+ajizUcOZj+rmTIX/NW7cuBg1alQMHjw49tlnn7juuutixYoVceqpp2YdLS+MGTMmZsyYEQ888ECUlpbG4sWLIyKiXbt2UVJSknG6xq+0tHS9ayxbt24dHTt2dO1lPZx33nmx//77x5VXXhnHHHNMPPvss3HTTTfFTTfdlHW0vHDYYYfFFVdcET179ozddtstXnzxxfjpT38a3/3ud7OOBmTAbNQwZqOGMx81nNmo4cxHmyBHteuvvz7Xs2fPXMuWLXP77LNPbt68eVlHyhsRscHHrbfemnW0vDVs2LDc2LFjs46Rdx566KFc//79c0VFRbldd901d9NNN2UdKW+UlZXlxo4dm+vZs2euuLg416dPn9yFF16Yq6ioyDoakBGzUTqz0ZZhPqo/s1HDmI/qVpDL5XLZ1BkAAABAPnNPBQAAACCJUgEAAABIolQAAAAAkigVAAAAgCRKBQAAACCJUgEAAABIolQAAAAAkigVAAAAgCRKBfiCOeWUU+LII4+s/nr48OFx7rnnbvUcTzzxRBQUFMTSpUu3+r4BANYxG8GWpVSAreSUU06JgoKCKCgoiJYtW8ZOO+0Ul156aaxdu3aL7ve//uu/4rLLLtukdb3ZAQBbi9kIvhiaZx0AmpKDDz44br311qioqIg//OEPMWbMmGjRokVMnDixxnqrV6+Oli1bbpZ9brPNNptlOwAAm5vZCPKfMxVgKyoqKoouXbrEDjvsEGeccUaMHDkyHnzwwerT8q644oro1q1b7LLLLhERsXDhwjjmmGOiffv2sc0228QRRxwR7733XvX2KisrY9y4cdG+ffvo2LFj/PCHP4xcLldjn/9+il9FRUVccMEF0aNHjygqKoqddtopbrnllnjvvfdixIgRERHRoUOHKCgoiFNOOSUiIqqqqmLy5MnRu3fvKCkpiT322CN+//vf19jPH/7wh9h5552jpKQkRowYUSMnAMCGmI0g/ykVIEMlJSWxevXqiIh47LHHYsGCBTFr1qyYOXNmrFmzJg466KAoLS2NOXPmxJ///Odo06ZNHHzwwdWvmTJlStx2223xm9/8JubOnRufffZZ3HfffbXu8+STT4477rgjfvGLX8Trr78eN954Y7Rp0yZ69OgR9957b0RELFiwID766KP4+c9/HhERkydPjv/8z/+MadOmxWuvvRbnnXdenHTSSTF79uyI+Ocb/FFHHRWHHXZYvPTSS3HaaafFhAkTttRhAwC+oMxGkIdywFYxatSo3BFHHJHL5XK5qqqq3KxZs3JFRUW5888/Pzdq1Khc586dcxUVFdXr//a3v83tsssuuaqqquplFRUVuZKSktyjjz6ay+Vyua5du+auueaa6ufXrFmT6969e/V+crlcbtiwYbmxY8fmcrlcbsGCBbmIyM2aNWuDGR9//PFcROT+8Y9/VC9btWpVrlWrVrmnnnqqxrrf+973cscff3wul8vlJk6cmOvXr1+N5y+44IL1tgUAsI7ZCL4Y3FMBtqKZM2dGmzZtYs2aNVFVVRUnnHBCTJo0KcaMGRMDBgyoca3gyy+/HG+99VaUlpbW2MaqVavi7bffjmXLlsVHH30U++67b/VzzZs3j8GDB693mt86L730UhQWFsawYcM2OfNbb70VK1eujAMOOKDG8tWrV8fAgQMjIuL111+vkSMiYr/99tvkfQAATZPZCPKfUgG2ohEjRsTUqVOjZcuW0a1bt2je/P/+CrZu3brGuuXl5bHXXnvF9OnT19vOdtttl7T/kpKSer+mvLw8IiIefvjh2H777Ws8V1RUlJQDACDCbARfBEoF2Ipat24dO+200yatO2jQoLjrrruiU6dO0bZt2w2u07Vr13jmmWdi6NChERGxdu3aeOGFF2LQoEEbXH/AgAFRVVUVs2fPjpEjR673/Lr/DaisrKxe1q9fvygqKoq//e1vG23x+/btGw8++GCNZfPmzav7mwQAmjSzEeQ/N2qERurEE0+MbbfdNo444oiYM2dOvPvuu/HEE0/EOeecEx988EFERIwdOzauuuqquP/+++Ovf/1rnHnmmbV+jnKvXr1i1KhR8d3vfjfuv//+6m3efffdERGxww47REFBQcycOTM++eSTKC8vj9LS0jj//PPjvPPOi9tvvz3efvvtmD9/flx//fVx++23R0TE6aefHm+++WaMHz8+FixYEDNmzIjbbrttSx8iAKAJMRtB46RUgEaqVatW8eSTT0bPnj3jqKOOir59+8b3vve9WLVqVXU7/4Mf/CC+853vxKhRo2K//faL0tLS+OY3v1nrdqdOnRrf/va348wzz4xdd901Ro8eHStWrIiIiO233z4uueSSmDBhQnTu3DnOOuusiIi47LLL4qKLLorJkydH37594+CDD46HH344evfuHRERPXv2jHvvvTfuv//+2GOPPWLatGlx5ZVXbsGjAwA0NWYjaJwKchu7awkAAABALZypAAAAACRRKgAAAABJlAoAAABAEqUCAAAAkESpAAAAACRRKgAAAABJlAoAAABAEqUCAAAAkESpAAAAACRRKgAAAABJlAoAAABAEqUCAAAAkOT/Bw42VH5DV1xrAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 5
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
